h1b_df <- DATA

SECTION 1: BACKGROUND

SLIDE 7: MAP

htmltools::includeHTML("rMaps.html")

SECTION 2: STEM

SLIDE 9: Stem and non-stem histogram

DATA %>%
  group_by(year, stem) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
  geom_bar(stat = "identity", position = position_stack(reverse = FALSE), alpha = 0.8) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  labs(y="Number", x="\n Year") + 
  scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) + 
  theme_minimal() + 
  theme(plot.title = element_text(hjust=0.5)) +
  theme(legend.position = "top")

SLIDE 10: STEM and non-STEM boxplot: “Prevailing wage boxplot throughout years”

DATA %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
  ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
  geom_boxplot(aes(fill=as.factor(stem)), outlier.shape = NA, alpha=0.9, color = "white") +
  theme_minimal() +
 labs(x = "\n Prevailing wage ($)", y = "Density \n") +
  scale_y_continuous(labels = function(x){paste0(x / 1000, "K")}) +
  scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  coord_cartesian(ylim = c(40000, 100000))

SLIDE 11: Stem and non-stem prevailing wage distribution in 2018

DATA %>%
  filter(year == 2018) %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>% 
  ggplot(aes(x = prevailing_wage, color = as.factor(stem), fill = as.factor(stem))) +
  geom_density(adjust = 2, alpha = 0.7)+
  theme_classic() +
  labs(x = "\n Prevailing wage ($)", y = expression(Density~(10^{-3})), title = "Distribution of prevailing wage in 2018") +
  scale_x_continuous(labels = function(x){paste0(x/1000, 'K')}) +
  scale_y_continuous(labels = function(x){paste0(x * 1000, "")}) +
  scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  theme(plot.title = element_text(hjust=0.5)) +
  theme_minimal()

SLIDE 12 AND 13: bar plot: stem jobs

dt <- DATA %>% 
  mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "senior systems analyst jc60"), "senior systems analyst", job_title)) %>% 
  filter(stem == 1)
# 
# dt %>% 
#   filter(year == 2017) %>% 
#   group_by(job_title) %>% 
#   summarise(n = n()) %>%
#   arrange(-n) %>% 
#   slice(1:20) %>% 
#   mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
#   arrange(n) %>% 
#   ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
#   labs(y = "Number of Aplications", x = "Job Titles") +
#   theme_minimal()

dt %>% 
  filter(year == 2018) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
  arrange(n) %>% 
  ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
  labs(y = "Number of Aplications", x = "Job Titles")+
  theme_minimal()+
  theme(
    legend.position = "none"
  ) 



# original
dt %>% 
  filter(year == 2018) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
  arrange(n) %>% 
  ggbarplot("job_title", "n", fill = "#00B2E4", alpha = 0.8, orientation = "horiz", color = "white") +
  labs(y = "Number of Aplications", x = "Job Titles") +
  theme_minimal()

Slide 15

dt <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Engineer","Data Analyst", "Data Scientist")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  arrange(-n) 

p1 <- dt %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2)+
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "Applications Data related jobs", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") + 
  theme_minimal() +
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))
p1

slide 16

filtered_job <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Engineer", "Data Scientist","Data Analyst"))


filtered_job$data_job_title <- factor(filtered_job$data_job_title, levels = c("Data Analyst", "Business Analyst", "Data Engineer", "Data Scientist"), ordered = TRUE)


filtered_job %>% group_by(data_job_title) %>% summarise(mean = mean(prevailing_wage))
filtered_job %>%  
  ggplot(aes(y = prevailing_wage, x = data_job_title)) +
  geom_boxplot(fill = "#00B2E4", outlier.shape = NA, color = "white", width = 0.5) +
  coord_cartesian(ylim = c(50000, 120000)) +
  theme_minimal() +
  labs(x = "\n Job title", y = "Prevailing wage (per year) \n", title = "Prevailing wages in data related jobs") +
  theme(plot.title = element_text(size = 1),
        text = element_text(size = 12),
        axis.title = element_text(size = 16),
        axis.text.x= element_text(size = 10),
        axis.text.y = element_text(size = 10)) +
  theme(plot.title = element_text(hjust = 0.5))

Slide 17

Slide 17

Data jobs in top companies


filtered_job_all <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Analyst", "Data Engineer", "Data Scientist")) %>% 
  mutate(employer_name = ifelse(str_detect(employer_name,'apple'), 'Apple',
                          ifelse(str_detect(employer_name,'microsoft'), 'Microsoft',
                          ifelse(str_detect(employer_name,'amazon'),'Amazon',
                          ifelse(str_detect(employer_name,'facebook'),'Facebook',
                          ifelse(str_detect(employer_name,'google'),'Google',
                          ifelse(str_detect(employer_name, 'ibm'),'IBM',employer_name))))))) 
  

#IBM

filtered_job_all %>% 
  filter(employer_name == 'IBM') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

NA
NA

Infosys


filtered_job_all %>% 
  filter(str_detect(employer_name, 'infosys')) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Microsoft

filtered_job_all %>% 
  filter(employer_name == 'Microsoft') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Amazon

filtered_job_all %>% 
  filter(employer_name == 'Amazon') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Deloitte

filtered_job_all %>% 
  filter(str_detect(employer_name, "deloitte")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Facebook

filtered_job_all %>% 
  filter(str_detect(employer_name, "Facebook")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Apple

filtered_job_all %>% 
  filter(str_detect(employer_name, "Apple")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Google

filtered_job_all %>% 
  filter(str_detect(employer_name, "Google")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Facebook

h1b_facebook <- h1b_df %>% 
  filter(employer_name == 'facebook') %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
  
con=c("Data Scientist","software engineer","Data Engineer",'research scientist')
ggplot(h1b_facebook, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Facebook",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_facebook, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))+
  scale_color_discrete(labels = c("Data Engineer", "Data Scientist", "Research Scientist","Software Engineer"))

Amazon


h1b_amazon <- h1b_df %>% 
  filter(str_detect(employer_name,'amazon')) %>% 
  ungroup(data_job_title) %>% 
  mutate(job_title=ifelse(str_detect(data_job_title,'software development engineer'), 'software development engineer', 
                   ifelse(str_detect(data_job_title,'technical program manager'), 'technical program manager',data_job_title)))%>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Data Scientist","software development engineer","business analyst","Data Engineer","technical program manager")
ggplot(h1b_amazon, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Amazon",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_amazon, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Business Analyst", "Data Engineer", "Data Scientist","Software Development Engineer","Technical Program Manager"))

Microsoft

h1b_micro <- h1b_df %>% 
  filter(str_detect(employer_name,'microsoft')) %>% 
  ungroup(data_job_title) %>% 
  mutate(job_title=ifelse(str_detect(data_job_title,'software engineer|software development engineer'), 'software engineer', 
                   ifelse(str_detect(data_job_title,'program manager'), 'program manager',data_job_title))) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
  
con=c("Data Scientist","software engineer","program manager")
ggplot(h1b_micro, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Microsoft",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_micro, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Data Scientist","Program Manager","Software Engineer"))

Google

h1b_google <- h1b_df %>% 
  filter(str_detect(employer_name,'google')) 
  
h1b_google <- h1b_google %>% 
  ungroup(job_title) %>% 
  mutate(job_title=ifelse(str_detect(job_title,'software engineer'), 'software engineer',
              ifelse(str_detect(job_title,'hardware engineer'), 'hardware engineer',job_title))) %>% 
  group_by(job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Data Scientist","software engineer","program manager","product manager","business analyst")
ggplot(h1b_google, aes(x = year, y = n, group = job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Google",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_google, job_title %in% con),aes(col=job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Business Analyst", "Data Scientist","Product Manager","Program Manager", "Software Engineer"))

IBM

h1b_ibm <- h1b_df %>% 
  filter(str_detect(employer_name,'ibm')) 
  
h1b_ibm <- h1b_ibm %>% 
  ungroup(job_title) %>% 
  mutate(job_title=ifelse(str_detect(job_title,'software engineer'), 'software engineer',
              ifelse(str_detect(job_title,'hardware engineer'), 'hardware engineer',job_title))) %>% 
  group_by(job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("consultant","application developer","it specialist","software engineer","project manager")
ggplot(h1b_ibm, aes(x = year, y = n, group = job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in IBM",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5))+
  # geom_line(data = subset(h1b_ibm, job_title %in% con),aes(col=job_title),size=0.7)+
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))
Error in FUN(X[[i]], ...) : object 'data_job_title' not found

Uber

h1b_uber <- h1b_df %>% 
  filter(str_detect(employer_name,'uber')) %>% 
  ungroup(data_job_title) %>% 
  mutate(data_job_title=ifelse(str_detect(data_job_title,'software engineer'), 'Software Engineer', 
        data_job_title)) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Software Engineer","Data Scientist","Data Analyst")
ggplot(h1b_uber, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Uber",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_uber, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))

Alluvia

filtered_job <- DATA %>% 
  filter(year == 2018) %>% 
  filter(data_job_title %in% c("Business Analyst","Data Analyst","Data Engineer", "Data Scientist"))


top_10_state <- filtered_job %>% 
  group_by(worksite_state_abb) %>% 
  summarise(count = n()) %>% 
  arrange(desc(count)) %>% 
  slice(1:10) 

flows <- filtered_job %>% 
  filter(worksite_state_abb %in% top_10_state$worksite_state_abb) %>% 
  group_by(data_job_title,
           worksite_state_abb) %>%
  summarise(count = n())


ggplot(flows, aes(y =count, axis1=data_job_title, axis2=worksite_state_abb)) +
  geom_alluvium(aes(fill = data_job_title)) +
  geom_stratum(width = 1/8, fill = "black", color = "grey", alpha = 0.8) +
  geom_label(stat = "stratum", label.strata = TRUE) +
  theme_classic()+
  theme(legend.position = "bottom") +
  scale_fill_manual(values = c("#6ba8a9","#465881", "#999999", "#FC2967"))

bar plot:stem program in different job titles

DATA %>% 
  mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>% 
  filter(year == 2018) %>% 
  filter(stem == 1) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  ggbarplot("job_title", "n", fill = "#00B2E4", color = "white", alpha = 0.8, sort.val = "asc", orientation = "horiz") %>% 
  labs(title = "stem program")
[[1]]

$title
[1] "stem program"

attr(,"class")
[1] "labels"

MAP - data job with the highest number in each city

ggplot(points) + 
  geom_sf(data = state_maps, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 0.1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.position = c(0,0), legend.justification = c(0,0))+
  labs(x = "", y = "", title = "")

ggplot(points_ca) + 
  geom_sf(data = state_maps_ca, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

ggplot(points_northeast) + 
  geom_sf(data = state_maps_northeast, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

ggplot(points_midwest) + 
  geom_sf(data = state_maps_midwest, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

ggplot(points_tn) + 
  geom_sf(data = state_maps_tn, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCiMgU0VDVElPTiAxOiBCQUNLR1JPVU5ECiMgU0xJREUgNzogTUFQCgpgYGB7cn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgick1hcHMuaHRtbCIpCmBgYAoKIyBTRUNUSU9OIDI6IFNURU0KIyBTTElERSA5OiBTdGVtIGFuZCBub24tc3RlbSBoaXN0b2dyYW0KYGBge3IgZmlnLmhlaWdodD0zLjUsIGZpZy53aWR0aD0zfQpEQVRBICU+JQogIGdyb3VwX2J5KHllYXIsIHN0ZW0pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuLCBmaWxsID0gYXMuZmFjdG9yKHN0ZW0pKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBGQUxTRSksIGFscGhhID0gMC44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgbGFicyh5PSJOdW1iZXIiLCB4PSJcbiBZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHgvMTAwMCwgJ0snKX0pICsgCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCiMgU0xJREUgMTA6IFNURU0gYW5kIG5vbi1TVEVNIGJveHBsb3Q6ICJQcmV2YWlsaW5nIHdhZ2UgYm94cGxvdCB0aHJvdWdob3V0IHllYXJzIgpgYGB7cn0KREFUQSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNjAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IoeWVhciksIHkgPSBwcmV2YWlsaW5nX3dhZ2UpKSArCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWFzLmZhY3RvcihzdGVtKSksIG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGE9MC45LCBjb2xvciA9ICJ3aGl0ZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogbGFicyh4ID0gIlxuIFByZXZhaWxpbmcgd2FnZSAoJCkiLCB5ID0gIkRlbnNpdHkgXG4iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4IC8gMTAwMCwgIksiKX0pICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDQwMDAwLCAxMDAwMDApKQpgYGAKCgojIFNMSURFIDExOiBTdGVtIGFuZCBub24tc3RlbSBwcmV2YWlsaW5nIHdhZ2UgZGlzdHJpYnV0aW9uIGluIDIwMTgKYGBge3J9CkRBVEEgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgZmlsdGVyKHByZXZhaWxpbmdfd2FnZSA+PSAwICYgcHJldmFpbGluZ193YWdlIDw9IDQwMDAwMCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHByZXZhaWxpbmdfd2FnZSwgY29sb3IgPSBhcy5mYWN0b3Ioc3RlbSksIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpKSArCiAgZ2VvbV9kZW5zaXR5KGFkanVzdCA9IDIsIGFscGhhID0gMC43KSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICJcbiBQcmV2YWlsaW5nIHdhZ2UgKCQpIiwgeSA9IGV4cHJlc3Npb24oRGVuc2l0eX4oMTBeey0zfSkpLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgcHJldmFpbGluZyB3YWdlIGluIDIwMTgiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4LzEwMDAsICdLJyl9KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4ICogMTAwMCwgIiIpfSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKIyBTTElERSAxMiBBTkQgMTM6IGJhciBwbG90OiBzdGVtIGpvYnMKYGBge3J9CmR0IDwtIERBVEEgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJidXNpbmVzcyIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSkgLCAiYnVzaW5lc3MgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLCAiZGF0YSBlbmdpbmVlciIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLCAiZGF0YSBzY2llbnRpc3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLCAiZGF0YSBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJsZWFybmluZyIpLCAiZGVlcCBsZWFybmluZyAmIG1hY2hpbmUgbGVhcm5pbmciLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksICJkYXRhIHByb2R1Y3QgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2VuaW9yIHN5c3RlbXMgYW5hbHlzdCBqYzYwIiksICJzZW5pb3Igc3lzdGVtcyBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIGZpbHRlcihzdGVtID09IDEpCiMgCiMgZHQgJT4lIAojICAgZmlsdGVyKHllYXIgPT0gMjAxNykgJT4lIAojICAgZ3JvdXBfYnkoam9iX3RpdGxlKSAlPiUgCiMgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiMgICBhcnJhbmdlKC1uKSAlPiUgCiMgICBzbGljZSgxOjIwKSAlPiUgCiMgICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQojICAgYXJyYW5nZShuKSAlPiUgCiMgICBnZ2JhcnBsb3QoImpvYl90aXRsZSIsICJuIiwgZmlsbCA9ICJjYXQiLCBwYWxldHRlID0gYygiI0ZDMjk2NyIsICIjMDBCMkU0IiksIGFscGhhID0gMC44LCBvcmllbnRhdGlvbiA9ICJob3JpeiIsIGNvbG9yID0gIndoaXRlIikgKwojICAgbGFicyh5ID0gIk51bWJlciBvZiBBcGxpY2F0aW9ucyIsIHggPSAiSm9iIFRpdGxlcyIpICsKIyAgIHRoZW1lX21pbmltYWwoKQoKZHQgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQogIGFycmFuZ2UobikgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gImNhdCIsIHBhbGV0dGUgPSBjKCIjRkMyOTY3IiwgIiMwMEIyRTQiKSwgYWxwaGEgPSAwLjgsIG9yaWVudGF0aW9uID0gImhvcml6IiwgY29sb3IgPSAid2hpdGUiKSArCiAgbGFicyh5ID0gIk51bWJlciBvZiBBcGxpY2F0aW9ucyIsIHggPSAiSm9iIFRpdGxlcyIpKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkgCgoKIyBvcmlnaW5hbApkdCAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIG11dGF0ZShjYXQgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGRhdGEiKSwgImRhdGEiLCAibm9uLWRhdGEiKSkgJT4lCiAgYXJyYW5nZShuKSAlPiUgCiAgZ2diYXJwbG90KCJqb2JfdGl0bGUiLCAibiIsIGZpbGwgPSAiIzAwQjJFNCIsIGFscGhhID0gMC44LCBvcmllbnRhdGlvbiA9ICJob3JpeiIsIGNvbG9yID0gIndoaXRlIikgKwogIGxhYnMoeSA9ICJOdW1iZXIgb2YgQXBsaWNhdGlvbnMiLCB4ID0gIkpvYiBUaXRsZXMiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyBTbGlkZSAxNQpgYGB7cixmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQpkdCA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsIkRhdGEgQW5hbHlzdCIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGFycmFuZ2UoLW4pIAoKcDEgPC0gZHQgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIkFwcGxpY2F0aW9ucyBEYXRhIHJlbGF0ZWQgam9icyIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCnAxCmBgYAoKIyBzbGlkZSAxNgoKYGBge3J9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIsIkRhdGEgQW5hbHlzdCIpKQoKCmZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSA8LSBmYWN0b3IoZmlsdGVyZWRfam9iJGRhdGFfam9iX3RpdGxlLCBsZXZlbHMgPSBjKCJEYXRhIEFuYWx5c3QiLCAiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiksIG9yZGVyZWQgPSBUUlVFKQoKCmZpbHRlcmVkX2pvYiAlPiUgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocHJldmFpbGluZ193YWdlKSkKZmlsdGVyZWRfam9iICU+JSAgCiAgZ2dwbG90KGFlcyh5ID0gcHJldmFpbGluZ193YWdlLCB4ID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzAwQjJFNCIsIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAid2hpdGUiLCB3aWR0aCA9IDAuNSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyg1MDAwMCwgMTIwMDAwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gIlxuIEpvYiB0aXRsZSIsIHkgPSAiUHJldmFpbGluZyB3YWdlIChwZXIgeWVhcikgXG4iLCB0aXRsZSA9ICJQcmV2YWlsaW5nIHdhZ2VzIGluIGRhdGEgcmVsYXRlZCBqb2JzIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0Lng9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKIyBTbGlkZSAxNwpgYGB7cn0KCnRvcF9jb20gPC0gREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIHVuZ3JvdXAoKQoKdG9wX2NvbSA8LXRvcF9jb20kZW1wbG95ZXJfbmFtZSAKCnNwYV9kYXRhIDwtIERBVEEgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICVpbiUgdG9wX2NvbSkgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICE9ICJjYXBnZW1pbmkgYW1lcmljYSBpbmMiKSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpIAoKY29uPWMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpCm15Q29sb3IgPC0gYygiIzQ2NTg4MSIsICIjRkZCNkMxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIsICIjRkMyOTY3IikKCiMgYyhhbWF6b24sICJkZWxvaXR0ZSIsICIjZmFjZWJvb2siLCAiaWJtIiwgImluZm8iKQoKZ2dwbG90KHNwYV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGVtcGxveWVyX25hbWUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnMoeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICIiKSArCiAgdGhlbWVfY2xhc3NpYygpKwogIGdlb21fbGluZShkYXRhID0gc3Vic2V0KHNwYV9kYXRhLCBlbXBsb3llcl9uYW1lICVpbiUgY29uKSxhZXMoY29sPWVtcGxveWVyX25hbWUpLHNpemU9MS4yKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15Q29sb3IsIGJyZWFrcyA9IGMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpLCBsYWJlbHMgPSBjKCJJbmZvc3lzIExpbWl0ZWQiLCAiRGVsb2l0dGUgQ29uc3VsdGluZyIsIkFtYXpvbiIsIkZhY2Vib29rIiwgIklCTSIpKSAgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgpgYGAKCgojIFNsaWRlIDE3CiMgVG9wIFRlY2ggQ29tcGFuaWVzIGFuZCBUaGVpciBUcmVuZHMKYGBge3J9CnNvY190b3BfdGVjaCA8LSBjKCJBcHBsZSIsCiAgICAgICAgICAgICAgICAgICJNaWNyb3NvZnQiLAogICAgICAgICAgICAgICAgICAiQW1hem9uIiwKICAgICAgICAgICAgICAgICAgIkZhY2Vib29rIiwKICAgICAgICAgICAgICAgICAgIkdvb2dsZSIsCiAgICAgICAgICAgICAgICAgICJJQk0iLAogICAgICAgICAgICAgICAgICAiQ2lzY28iKQoKCmgxYl9kZiAlPiUgCiAgZmlsdGVyKGNhc2Vfc3RhdHVzID09ICAiY2VydGlmaWVkIikgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImJ1c2luZXNzIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImludGVsbGlnZW5jZSIpKSAsICJCdXNpbmVzcyBBbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImVuZ2luZWVyIil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJ3YXJlaG91c2UiKSksICJEYXRhIEVuZ2luZWVyIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLCAiRGF0YSBTY2llbnRpc3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdCIpLCAiRGF0YSBBbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibGVhcm5pbmciKSwgIkRlZXAgTGVhcm5pbmcgJiBNYWNoaW5lIExlYXJuaW5nIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJwcm9kdWN0IikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8ZW5naW5lZXJ8ZGF0YSIpLCAiRGF0YSBQcm9kdWN0IEFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgZmlsdGVyKGpvYl90aXRsZSAlaW4lIGMoIkJ1c2luZXNzIEFuYWx5c3QiLCJEYXRhIEVuZ2luZWVyIiwiRGVlcCBMZWFybmluZyAmIE1hY2hpbmUgTGVhcm5pbmciLCJEYXRhIEFuYWx5c3QiLCAiRGF0YSBTY2llbnRpc3QiLCAiRGF0YSBQcm9kdWN0IEFuYWx5c3QiKSkgJT4lCiAgbXV0YXRlKGVtcGxveWVyX25hbWUgPSBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdhcHBsZScpLCAnQXBwbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ21pY3Jvc29mdCcpLCAnTWljcm9zb2Z0JywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdhbWF6b24nKSwnQW1hem9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdjaXNjbyBzeXMnKSwnQ2lzY28nLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2ZhY2Vib29rJyksJ0ZhY2Vib29rJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdnb29nbGUnKSwnR29vZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaWJtJyksJ0lCTScsJ25vJykpKSkpKSkpICU+JSAKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKHRvdCA9IG4oKSkgJT4lIAogIGZpbHRlcighZW1wbG95ZXJfbmFtZSAlaW4lIGMoIm5vIiwgTkEpKSAlPiUgCiAgdW5ncm91cCgpJT4lIAogIGdncGxvdCgpKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSB0b3QsIGNvbG9yID0gZW1wbG95ZXJfbmFtZSksIHNpemUgPSAxLjA1KSsKICBsYWJzKCB5ID0gIk51bWJlciBvZiBBcHBsaWNhdGlvbnMiLCB4ID0gIlllYXIiLCBjb2xvciA9ICJFbXBsb3llciIpICsKICB0aGVtZV9taW5pbWFsKCkgCgoKYGBgCgoKIyBEYXRhIGpvYnMgaW4gdG9wIGNvbXBhbmllcyAKCmBgYHtyfQoKZmlsdGVyZWRfam9iX2FsbCA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBBbmFseXN0IiwgIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiKSkgJT4lIAogIG11dGF0ZShlbXBsb3llcl9uYW1lID0gaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYXBwbGUnKSwgJ0FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdtaWNyb3NvZnQnKSwgJ01pY3Jvc29mdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJyksJ0FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZmFjZWJvb2snKSwnRmFjZWJvb2snLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2dvb2dsZScpLCdHb29nbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSwnSUJNJyxlbXBsb3llcl9uYW1lKSkpKSkpKSAKICAKYGBgCgojSUJNCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnSUJNJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgoKYGBgCgojIEluZm9zeXMKYGBge3J9CgpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaW5mb3N5cycpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKCmBgYAoKIyBNaWNyb3NvZnQKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lID09ICdNaWNyb3NvZnQnKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIEFtYXpvbgpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ0FtYXpvbicpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMgRGVsb2l0dGUKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJkZWxvaXR0ZSIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIEZhY2Vib29rCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiRmFjZWJvb2siKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBBcHBsZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkFwcGxlIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMgR29vZ2xlCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiR29vZ2xlIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMjIEZhY2Vib29rCgpgYGB7cn0KaDFiX2ZhY2Vib29rIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ2ZhY2Vib29rJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQogIApgYGAKCgoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwiRGF0YSBFbmdpbmVlciIsJ3Jlc2VhcmNoIHNjaWVudGlzdCcpCmdncGxvdChoMWJfZmFjZWJvb2ssIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIEZhY2Vib29rIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfZmFjZWJvb2ssIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiwgIlJlc2VhcmNoIFNjaWVudGlzdCIsIlNvZnR3YXJlIEVuZ2luZWVyIikpCgpgYGAKCiMjIEFtYXpvbgoKYGBge3J9CgpoMWJfYW1hem9uIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJykpICU+JSAKICB1bmdyb3VwKGRhdGFfam9iX3RpdGxlKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnc29mdHdhcmUgZGV2ZWxvcG1lbnQgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGRldmVsb3BtZW50IGVuZ2luZWVyJywgCiAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwndGVjaG5pY2FsIHByb2dyYW0gbWFuYWdlcicpLCAndGVjaG5pY2FsIHByb2dyYW0gbWFuYWdlcicsZGF0YV9qb2JfdGl0bGUpKSklPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCgpgYGAKCmBgYHtyfQpjb249YygiRGF0YSBTY2llbnRpc3QiLCJzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbmdpbmVlciIsImJ1c2luZXNzIGFuYWx5c3QiLCJEYXRhIEVuZ2luZWVyIiwidGVjaG5pY2FsIHByb2dyYW0gbWFuYWdlciIpCmdncGxvdChoMWJfYW1hem9uLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBBbWF6b24iLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl9hbWF6b24sIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiwiU29mdHdhcmUgRGV2ZWxvcG1lbnQgRW5naW5lZXIiLCJUZWNobmljYWwgUHJvZ3JhbSBNYW5hZ2VyIikpCmBgYAoKCiMjIE1pY3Jvc29mdAoKYGBge3J9CmgxYl9taWNybyA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ21pY3Jvc29mdCcpKSAlPiUgCiAgdW5ncm91cChkYXRhX2pvYl90aXRsZSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3NvZnR3YXJlIGVuZ2luZWVyfHNvZnR3YXJlIGRldmVsb3BtZW50IGVuZ2luZWVyJyksICdzb2Z0d2FyZSBlbmdpbmVlcicsIAogICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3Byb2dyYW0gbWFuYWdlcicpLCAncHJvZ3JhbSBtYW5hZ2VyJyxkYXRhX2pvYl90aXRsZSkpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCiAgCmBgYAoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwicHJvZ3JhbSBtYW5hZ2VyIikKZ2dwbG90KGgxYl9taWNybywgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gTWljcm9zb2Z0IiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfbWljcm8sIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiRGF0YSBTY2llbnRpc3QiLCJQcm9ncmFtIE1hbmFnZXIiLCJTb2Z0d2FyZSBFbmdpbmVlciIpKQpgYGAKCgojIyBHb29nbGUKCmBgYHtyfQpoMWJfZ29vZ2xlIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZ29vZ2xlJykpIAogIApgYGAKCmBgYHtyfQpoMWJfZ29vZ2xlIDwtIGgxYl9nb29nbGUgJT4lIAogIHVuZ3JvdXAoam9iX3RpdGxlKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsJ3NvZnR3YXJlIGVuZ2luZWVyJyksICdzb2Z0d2FyZSBlbmdpbmVlcicsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCdoYXJkd2FyZSBlbmdpbmVlcicpLCAnaGFyZHdhcmUgZW5naW5lZXInLGpvYl90aXRsZSkpKSAlPiUgCiAgZ3JvdXBfYnkoam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQpgYGAKCmBgYHtyfQpjb249YygiRGF0YSBTY2llbnRpc3QiLCJzb2Z0d2FyZSBlbmdpbmVlciIsInByb2dyYW0gbWFuYWdlciIsInByb2R1Y3QgbWFuYWdlciIsImJ1c2luZXNzIGFuYWx5c3QiKQpnZ3Bsb3QoaDFiX2dvb2dsZSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBqb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIEdvb2dsZSIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX2dvb2dsZSwgam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWpvYl90aXRsZSksc2l6ZT0wLjcpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiLCAiRGF0YSBTY2llbnRpc3QiLCJQcm9kdWN0IE1hbmFnZXIiLCJQcm9ncmFtIE1hbmFnZXIiLCAiU29mdHdhcmUgRW5naW5lZXIiKSkKYGBgCgoKIyMgSUJNIAoKYGBge3J9CmgxYl9pYm0gPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdpYm0nKSkgCiAgCmBgYAoKYGBge3J9CmgxYl9pYm0gPC0gaDFiX2libSAlPiUgCiAgdW5ncm91cChqb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlPWlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGVuZ2luZWVyJywKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsJ2hhcmR3YXJlIGVuZ2luZWVyJyksICdoYXJkd2FyZSBlbmdpbmVlcicsam9iX3RpdGxlKSkpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3J9CmNvbj1jKCJjb25zdWx0YW50IiwiYXBwbGljYXRpb24gZGV2ZWxvcGVyIiwiaXQgc3BlY2lhbGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwicHJvamVjdCBtYW5hZ2VyIikKZ2dwbG90KGgxYl9pYm0sIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBJQk0iLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX2libSwgam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWpvYl90aXRsZSksc2l6ZT0wLjcpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkKYGBgCgojIyBVYmVyCgpgYGB7cn0KaDFiX3ViZXIgPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCd1YmVyJykpICU+JSAKICB1bmdyb3VwKGRhdGFfam9iX3RpdGxlKSAlPiUgCiAgbXV0YXRlKGRhdGFfam9iX3RpdGxlPWlmZWxzZShzdHJfZGV0ZWN0KGRhdGFfam9iX3RpdGxlLCdzb2Z0d2FyZSBlbmdpbmVlcicpLCAnU29mdHdhcmUgRW5naW5lZXInLCAKICAgICAgICBkYXRhX2pvYl90aXRsZSkpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKYGBgCgpgYGB7cn0KY29uPWMoIlNvZnR3YXJlIEVuZ2luZWVyIiwiRGF0YSBTY2llbnRpc3QiLCJEYXRhIEFuYWx5c3QiKQpnZ3Bsb3QoaDFiX3ViZXIsIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIFViZXIiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl91YmVyLCBkYXRhX2pvYl90aXRsZSAlaW4lIGNvbiksYWVzKGNvbD1kYXRhX2pvYl90aXRsZSksc2l6ZT0wLjcpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkKYGBgCgoKIyMgQWxsdXZpYQpgYGB7cn0KZmlsdGVyZWRfam9iIDwtIERBVEEgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKQoKCnRvcF8xMF9zdGF0ZSA8LSBmaWx0ZXJlZF9qb2IgJT4lIAogIGdyb3VwX2J5KHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIAogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JSAKICBzbGljZSgxOjEwKSAKCmZsb3dzIDwtIGZpbHRlcmVkX2pvYiAlPiUgCiAgZmlsdGVyKHdvcmtzaXRlX3N0YXRlX2FiYiAlaW4lIHRvcF8xMF9zdGF0ZSR3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwKICAgICAgICAgICB3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKCgpnZ3Bsb3QoZmxvd3MsIGFlcyh5ID1jb3VudCwgYXhpczE9ZGF0YV9qb2JfdGl0bGUsIGF4aXMyPXdvcmtzaXRlX3N0YXRlX2FiYikpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9zdHJhdHVtKHdpZHRoID0gMS84LCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiZ3JleSIsIGFscGhhID0gMC44KSArCiAgZ2VvbV9sYWJlbChzdGF0ID0gInN0cmF0dW0iLCBsYWJlbC5zdHJhdGEgPSBUUlVFKSArCiAgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzZiYThhOSIsIiM0NjU4ODEiLCAiIzk5OTk5OSIsICIjRkMyOTY3IikpCmBgYAoKCiMjIGJhciBwbG90OnN0ZW0gcHJvZ3JhbSBpbiBkaWZmZXJlbnQgam9iIHRpdGxlcwpgYGB7cn0KREFUQSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImJ1c2luZXNzIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImludGVsbGlnZW5jZSIpKSAsICJidXNpbmVzcyBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImVuZ2luZWVyIil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJ3YXJlaG91c2UiKSksICJkYXRhIGVuZ2luZWVyIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2NpZW50aXN0IiksICJkYXRhIHNjaWVudGlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8YW5hbHl0aWNzIiksICJkYXRhIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIm1hY2hpbmV8ZGVlcCIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksICJkZWVwIGxlYXJuaW5nICYgbWFjaGluZSBsZWFybmluZyIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpICYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGVuZ2luZWVyfGRhdGEiKSwgImRhdGEgcHJvZHVjdCBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBmaWx0ZXIoc3RlbSA9PSAxKSAlPiUgCiAgZ3JvdXBfYnkoam9iX3RpdGxlKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pICU+JSAKICBzbGljZSgxOjIwKSAlPiUgCiAgZ2diYXJwbG90KCJqb2JfdGl0bGUiLCAibiIsIGZpbGwgPSAiIzAwQjJFNCIsIGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjgsIHNvcnQudmFsID0gImFzYyIsIG9yaWVudGF0aW9uID0gImhvcml6IikgJT4lIAogIGxhYnModGl0bGUgPSAic3RlbSBwcm9ncmFtIikKYGBgCgojIE1BUCAtIGRhdGEgam9iIHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIGluIGVhY2ggY2l0eSAKYGBge3J9CmdncGxvdChwb2ludHMpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwcywgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImxpZ2h0Z3JleSIsYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGppdHRlcihsb24sMTAwKSwgeSA9IGppdHRlcihsYXQsMTAwKSwgY29sb3IgPSBtYXhfam9iKSwgc2l6ZSA9IDAuMSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKSkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c19jYSkgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX2NhLCBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAibGlnaHRncmV5IixhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaml0dGVyKGxvbiksIHkgPSBqaXR0ZXIobGF0KSwgY29sb3IgPSBtYXhfam9iKSwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QocG9pbnRzX25vcnRoZWFzdCkgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX25vcnRoZWFzdCwgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImxpZ2h0Z3JleSIsYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGppdHRlcihsb24pLCB5ID0gaml0dGVyKGxhdCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c19taWR3ZXN0KSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHNfbWlkd2VzdCwgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImxpZ2h0Z3JleSIsYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGppdHRlcihsb24sMTAwKSwgeSA9IGppdHRlcihsYXQsMTAwKSwgY29sb3IgPSBtYXhfam9iKSwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QocG9pbnRzX3RuKSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHNfdG4sIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uKSwgeSA9IGppdHRlcihsYXQpLCBjb2xvciA9IG1heF9qb2IpLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICAgICAgICApKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIpCmBgYA==